using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SList
{
    class LLElement<T>
    {
        public T data;
        public LLElement<T> Next;

        public LLElement(T data)
        {
            this.data = data;
        }

        public T Value { get { return data; } set { data = value; } }
    }

    class LinkedL<T>
    {
        public LLElement<T> First; // первый элемент
        public LLElement<T> Last;  // последний элемент

        public LinkedL()
        {
            First = null;
            Last = null;
        }

        public void Add(T element)
        {
            LLElement<T> ListElement = new LLElement<T>(element);
            if (First == null) First = ListElement;
            else
            {
                // ListElement.Prev = Last;
                Last.Next = ListElement;
            }
            Last = ListElement;
        }

        public LLElement<T> Next(LLElement<T> element)
        {
            if (element == null) throw new Exception("");
            else return element.Next;
        }

        public void Reverse()
        {
            LLElement<T> current = First;
            LLElement<T> prev = null;
            LLElement<T> next = null;

            while (current != null)
            {
                next = current.Next;
                current.Next = prev;
                prev = current;
                current = next;
            }

            First = prev;
        }

        public void printAll()
        {
            LLElement<T> cn = First;
            while (cn != null)
            {
                Console.Write(cn.Value + " | ");
                cn = cn.Next;
            }
        }

    }

    class Example
    {
        void Do()
        {
            LinkedL<string> LinkList = new LinkedL<string>();
            //
            string s = "";
            Console.WriteLine("Для выхода из цикла введите [yes].");
            for (; ; )
            {
                s = "";
                s = Console.ReadLine();
                if (s == "") break;
                else LinkList.Add(s);
            }
            // вывод в прямом направлении
            Console.Write("Прямое направление:   ");
            LinkList.printAll();
            LinkList.Reverse(); //переворачиваем
            Console.WriteLine();
            Console.Write("Перевернутый список: ");
            LinkList.printAll(); //выводим
            Console.ReadLine();
        }
    }
}
